home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / misc / vpan100.zip / VPGRWMAR.H < prev    next >
C/C++ Source or Header  |  1995-01-18  |  11KB  |  395 lines

  1. //    GRAPH WITH MARKER
  2. //
  3. //        VPGRWMAR.H: CLASS TEMPLATE   TSGraph 
  4. //
  5. //    APPLICATION FOR VIRTUAL PANELS
  6. //
  7. //    Written by O.Rasizade, 1993
  8. //
  9. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10. #include <lgindic.h>
  11.  
  12. #ifndef __cplusplus
  13. #error Must use C++ for the type GraphWithMarker
  14. #endif
  15.  
  16. #ifndef __VPGRWMAR_H
  17. #define __VPGRWMAR_H
  18.  
  19. #define BUTT_HEIGHT    18
  20. #define BUTT_FONT       SMALL_FONT
  21. #define BUTT_FONT_SIZE    4
  22. #define MARKER_OFFSET    30
  23. #define XT_INT        1
  24. #define XT_FLOAT    0
  25.  
  26.  
  27. template<class XType,class YType>
  28. class GraphWithMarker : public Graph<XType,YType>
  29. {
  30.  protected:
  31.    YType far *pfArray;
  32.    int xtype;        // type of x,may be XT_INT or XT_FLOAT
  33.  
  34.    int iN;        // size of arrays
  35.    int iNdisp;        // size of displayed part of arrays
  36.  
  37.    XType xabsval0, xabsvalmax;    // start and end of whole array
  38.    double dxi;        // xvalue per index of array
  39.    int  index0, indexmax, indexleft, indexright, indexdel;
  40.    char * xindfmt, * yindfmt;    // format for indicators
  41.  
  42.    XType xmarker, xmarkerl, xmarkerr;    // coord of markers: central, left, right
  43.    YType ymarker;
  44.  
  45.    Indicator<XType>  *pindX;
  46.    Indicator<YType>  *pindY;
  47.  
  48.    int  XorMarker(int index);    // returns current value of index of marker
  49.    int  ShowFullSize(void);     // show array in full size, returns index of marker
  50.  
  51.  public:
  52.  
  53.  //------ Constructor ---- ALL SIZES IN VGA PIXELS ------
  54. GraphWithMarker(int _iN, YType far *_pfArray,
  55.     int _xtype,            // may be XT_INT or XT_FLOAT
  56.     char * _xindfmt, char * _yindfmt, // format for indicators
  57.     int _x0,int _y0,    /* where to paint graph*/
  58.     objtype _type,        // may be FIXED,PERM,POPUP
  59.     char *_title,
  60.     int xtics,int ytics,    /* number of x & y div.            */
  61.     int xpixtic,int ypixtic,// number of pixels between tics
  62.  
  63.     float _xval0,float _yval0,/* values of x,y (LIN) or powers of 10 (LOG) at origin*/
  64.     float _xvalmax,float _yvalmax,// values of x,y at end of axis
  65.                       //  only for LIN scales
  66.               //------------ Hereafter are defaults
  67.     void (far *_paintproc)()=procNULL,
  68.     char *_xtitle="",char *_ytitle="",    // axes titles
  69.     char *xticfmt="",char *yticfmt="", // format of tic labels
  70.                        // can be only float %[..]f
  71.     int _xscale=LIN, int _yscale=LIN,  // may be LIN or LOG
  72.     int _frame=FRAMED,            // display may FRAMED or UNFRAMED
  73.     int _titlefont=0,int _titlefontsize=1,    // title
  74.     int axtitlefont=0,int axtitlefontsize=1,      // tic labels
  75.     int ticfont=SMALL_FONT,int ticfontsize=2,    //div.numbers
  76.  
  77.     graphcolors graphcolconfig=YellowOnCyan,
  78.     plaquecolors framecolconfig=plaquecoldflt,
  79.     int gridstyle=0x5555) :        // style of grid lines
  80.  
  81.       Graph<XType,YType>(_x0,_y0,_type,_title,xtics,ytics,xpixtic,ypixtic,_xval0,_yval0,
  82.     _xvalmax,_yvalmax,_paintproc,_xtitle,_ytitle,xticfmt,yticfmt,
  83.     _xscale,_yscale,_frame,_titlefont,_titlefontsize,
  84.     axtitlefont,axtitlefontsize,ticfont,ticfontsize,
  85.     graphcolconfig,framecolconfig,gridstyle)
  86.  
  87.     {
  88.        iN = iNdisp = _iN;
  89.        index0 = 0;     indexmax = iN - 1;
  90.        xtype = _xtype;
  91.        dxi = (xvalmax - xval0) / (iN - 1);
  92.        pfArray = _pfArray;
  93.        xabsval0 = _xval0 ;    xabsvalmax = _xvalmax;
  94.        xindfmt = _xindfmt;    yindfmt = _yindfmt;
  95.        xmarker = (xvalmax + xval0)/2;
  96.        ymarker = (yvalmax + yval0)/2;
  97.        yymax += BUTT_HEIGHT + 10;
  98.        ymax=y__yy(yymax);
  99. int y0ind = y__yy( yymaxp+SHADWIDTH+XNOTCHLENGTH+ numbheight+ 2*yyspacing);
  100.     pindY = new Indicator<YType>
  101.             ( x0, y0ind, FIXED, ytitle, 15,
  102.               &ymarker, yindfmt,
  103.               UNFRAMED,procDummy,
  104.               SMALL_FONT,4,        //font and size of number
  105.               SMALL_FONT,4);    //font and size of title
  106.  
  107.     pindX = new Indicator<XType>
  108.             ( pindY->xmax, y0ind, FIXED, xtitle, 15,
  109.               &xmarker, xindfmt,
  110.               UNFRAMED,procDummy,
  111.               SMALL_FONT,4,    //font and size of number
  112.               SMALL_FONT,4);    //font and size of title
  113.  
  114.      }
  115. //---------------------- end of constructor GraphWithMarker::GraphWithMarker
  116.  
  117. //---------------------DESTRUCTOR -----------
  118. ~GraphWithMarker(void)
  119.  {
  120.     delete  pindX;
  121.    delete  pindY;
  122.  }
  123.  
  124. //-------------------------- METHODS ----------
  125. virtual void Paint(void);
  126.  void Marker(void);    // returns current value of index of Array
  127.  void InstallArray(YType far *pfArr) { pfArray = pfArr;}
  128.  void FindMinMax( YType &max, YType &min);
  129.  };
  130.  
  131. //--------------------------- IMPLICATION OF METHODS -----
  132.  
  133. //------------------------------- PAINT
  134. template<class XType,class YType>
  135.  void GraphWithMarker<XType,YType>::Paint(void)
  136.  {
  137.   Graph<XType,YType>::Paint();
  138.   pindX->Paint();
  139.   pindY->Paint();
  140.   setcolor( RED );
  141.   maxviewport;
  142.   settextstyle( SMALL_FONT, HORIZ_DIR, 4);
  143.   settextjustify(LEFT_TEXT, TOP_TEXT);
  144.   outtextxy( pindX->xxmax, (pindX->yymax+pindX->yy0)/2,
  145.           "Enter-Zoom Home \'+\'\'-\' PgUp PgDn");
  146.  }
  147.  
  148. //--------------------------------- XOR MARKER, PROTECTED
  149. template<class XType,class YType>
  150.  int GraphWithMarker<XType,YType>::XorMarker(int index)
  151. {
  152.   if ( index0 < 0)
  153.    index0 = 0 ;
  154.   if ( indexmax >= iN )
  155.    indexmax = iN - 1;
  156.  
  157.   if ( index < index0 )
  158.    index = index0 ;
  159.   if ( index > indexmax )
  160.    index = indexmax ;
  161.  
  162.   indexleft =  index - indexdel;
  163.   indexright = index + indexdel;
  164.  
  165.   if ( indexleft < index0 )
  166.    indexleft = index0 ;
  167.   if ( indexleft > index )
  168.    indexleft= index ;
  169.  
  170.   if ( indexright < index )
  171.    indexright = index ;
  172.   if ( indexright > indexmax)
  173.    indexright = indexmax ;
  174.  
  175.   if ( xtype == XT_INT )
  176.    {
  177.      xmarker  = xabsval0 + round(index * dxi);
  178.      xmarkerl = xabsval0 + round(indexleft * dxi);
  179.      xmarkerr = xabsval0 + round(indexright * dxi);
  180.     }
  181.   else
  182.    {
  183.      xmarker = xabsval0 + index * dxi;
  184.      xmarkerl = xabsval0 + round(indexleft * dxi);
  185.      xmarkerr = xabsval0 + round(indexright * dxi);
  186.     }
  187.  
  188.   setlinestyle(SOLID_LINE,0,NORM_WIDTH);
  189.   setwritemode(XOR_PUT);
  190.   PutLine(xmarker,yvalmax,xmarker,yval0, WHITE);
  191.   PutLine(xmarkerl,yvalmax,xmarkerl,yval0, CYAN);
  192.   PutLine(xmarkerr,yvalmax,xmarkerr,yval0, CYAN);
  193.  
  194.   setwritemode(COPY_PUT);
  195.   return index;
  196. }
  197.  
  198. //---------------------------------- SHOW ARRAY FULL SIZE, protected
  199. //------------ return index of the marker
  200.  template<class XType,class YType>
  201.  int GraphWithMarker<XType,YType>::
  202.    ShowFullSize(void)
  203. {
  204. int index;
  205. YType MaxY, MinY;
  206.  
  207.  index0 = 0;
  208.  indexmax = round( (xabsvalmax - xabsval0)/dxi );
  209.  index    = (indexmax + index0)/2;
  210.  indexdel = (indexmax - index0)/8;
  211.  
  212.  FindMinMax( MaxY, MinY);
  213.  pgrSpectra->SetupAxisX( xabsval0, xabsvalmax);
  214.  pgrSpectra->SetupAxisY( MinY, MaxY);
  215.  pgrSpectra->PrintTicLabelsX();
  216.  pgrSpectra->PrintTicLabelsY();
  217.  
  218.   iNdisp = indexmax - index0 + 1;
  219.   cls();
  220.   ShowCurve( iNdisp, xval0, xvalmax, pfArray);
  221.   return index;
  222. }//------------ ShowFullSize(void) -----
  223.  
  224. //-------------------------------- MARKER
  225. template<class XType,class YType>
  226.  void GraphWithMarker<XType,YType>::Marker(void)
  227. {
  228. int ch, index;
  229. YType MaxY, MinY;
  230.  
  231.   index = ShowFullSize();
  232.   XorMarker(index);
  233. int indexmax_0;
  234. float factor = 2.;
  235.  
  236.   while ( ( ch =getch()) != 27 )// while esc
  237.    {
  238.     switch ( ch )
  239.      {
  240.     case 43:        // + - scale Y up
  241.         Enter("Enter Factor", "Stretch by:","%f",
  242.                         &factor, 18);
  243.         pgrSpectra->SetupAxisY( yval0, yval0 +
  244.                     (yvalmax - yval0)*factor);
  245.         pgrSpectra->PrintTicLabelsY();
  246.         cls();
  247.         ShowCurve( iNdisp, xval0, xvalmax, pfArray + index0);
  248.         goto display;
  249.  
  250.     case 45:        // '-' - scale Y up
  251.         Enter("Enter Factor", "Shrink by:","%f",
  252.                         &factor, 18);
  253.         pgrSpectra->SetupAxisY( yval0, yval0 +
  254.                     (yvalmax - yval0)/factor);
  255.         pgrSpectra->PrintTicLabelsY();
  256.         cls();
  257.         ShowCurve( iNdisp, xval0, xvalmax, pfArray + index0);
  258.         goto display;
  259.  
  260.     case 13:    // Enter - zoom
  261.            if ( indexleft < indexright )
  262.         {
  263.         index0   = indexleft;
  264.         indexmax = indexright;
  265.         index    = (indexmax + index0)/2;
  266.         indexdel = (indexmax - index0)/8;
  267.  
  268.         iNdisp   = indexmax - index0 + 1;
  269.         FindMinMax( MaxY, MinY);
  270.  
  271.         pgrSpectra->SetupAxisX( xmarkerl, xmarkerr);
  272.         pgrSpectra->SetupAxisY( MinY, MaxY);
  273.         pgrSpectra->PrintTicLabelsX();
  274.         pgrSpectra->PrintTicLabelsY();
  275.         cls();
  276.         ShowCurve( iNdisp, xval0, xvalmax, pfArray + index0);
  277.            }
  278.         goto display;
  279.  
  280.      case 0:
  281.          switch (getch())
  282.          {
  283.            case 73:        // Page Up - scroll right
  284.         indexmax_0 = (indexmax - index0)/2;
  285.         if ( indexmax + indexmax_0 < iN )
  286.         {
  287.          index0 += indexmax_0;
  288.          indexmax += indexmax_0;
  289.          index    += indexmax_0;
  290.          }
  291.         else
  292.          {
  293.           indexmax = iN - 1;
  294.           index0   = indexmax - 2*indexmax_0;
  295.           index    = index0 + indexmax_0;
  296.          }
  297.          goto display1;
  298.  
  299.            case 81:        // Page Down - scroll left
  300.         indexmax_0 = (indexmax - index0)/2;
  301.         if ( index0 - indexmax_0 > 0 )
  302.         {
  303.          index0 -= indexmax_0;
  304.          indexmax -= indexmax_0;
  305.          index    -= indexmax_0;
  306.  
  307.         }
  308.         else
  309.          {
  310.           index0 = 0;
  311.           indexmax = index0 + 2*indexmax_0;
  312.           index = index0 + indexmax_0;
  313.          }
  314.         goto display1;
  315.  
  316.            case 71:        // Home - restore
  317.          index = ShowFullSize();
  318.          goto display;
  319.  
  320.            case 80:        // down arrow - narrow window
  321.          XorMarker(index);
  322.          indexdel--;
  323.          goto display;
  324.  
  325.            case 72:        // up arrow - widen window
  326.          XorMarker(index);
  327.          indexdel++;
  328.          goto display;
  329.  
  330.            case 75:        // left arrow - marker left fast
  331.          XorMarker(index);
  332.          index -= MARKER_OFFSET;
  333.          goto display;
  334.  
  335.            case 77:        // right arrow - marker right fast
  336.          XorMarker(index);
  337.          index += MARKER_OFFSET;
  338.          goto display;
  339.  
  340.            case 115:    // Ctrl-left arrow - marker left slowly
  341.          XorMarker(index);
  342.          --index;
  343.          goto display;
  344.  
  345.            case 116:    // Ctrl-right arrow - marker right slowly
  346.          XorMarker(index);
  347.          ++index;
  348.          goto display;
  349.  
  350.           display1:
  351.         if ( xtype == XT_INT )
  352.            {
  353.              xval0   = xabsval0 + round(index0 * dxi);
  354.              xvalmax = xabsval0 + round(indexmax * dxi);
  355.             }
  356.         else
  357.            {
  358.              xval0   = xabsval0 + index0 * dxi;
  359.              xvalmax = xabsval0 + indexmax * dxi;
  360.             }
  361.  
  362.         pgrSpectra->SetupAxisX( xval0, xvalmax);
  363.         pgrSpectra->PrintTicLabelsX();
  364.         iNdisp   = indexmax - index0 + 1;
  365.         cls();
  366.         ShowCurve( iNdisp, xval0, xvalmax, pfArray + index0);
  367.  
  368.           display:
  369.         index = XorMarker(index);
  370.         ymarker = pfArray[index];
  371.         pindX->Refresh();
  372.         pindY->Refresh();
  373.           }//switch(  second char )
  374.     }//switch(  first char )
  375.    }//while
  376.  XorMarker(index);
  377. }//------------ void Marker(void) -------
  378.  
  379. //----------------------- FIND MIN AND MAX VALUE OF ARRAY, PROTECTED
  380. template<class XType,class YType>
  381.  void GraphWithMarker<XType,YType>::
  382.       FindMinMax(YType &max,YType &min)
  383. {
  384. max=pfArray[index0];  min=pfArray[index0];
  385.  for (int i=index0; i <= indexmax; i++)
  386.   {
  387.     if (max < pfArray[i]) max = pfArray[i];
  388.     if (min > pfArray[i]) min = pfArray[i];
  389.    }
  390.  if ( max == min )
  391.       max = 1 + min;
  392. } // FindMinMaxXt
  393.  
  394.  
  395. #endif  // __VPGRWMAR_H